from selenium import webdriver
import win32gui # pip install pywin32
import win32con
import time

from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By

"""
win32gui.FindWindow(lpClassName=None, lpWindowName=None):
     自顶层窗口开始寻找匹配条件的窗口，并返回这个窗口的句柄。
     lpClassName：类名，在Spy++里能够看到
     lpWindowName：窗口名，标题栏上能看到的名字
     代码示例里我们用来寻找上传窗口，你可以只用其中的一个，用classname定位容易被其他东西干扰，用windowname定位不稳定，不同的上传对话框可能window_name不同，怎么定位取决于你的情况。
win32gui.FindWindowEx(hwndParent=0, hwndChildAfter=0, lpszClass=None, lpszWindow=None)
     搜索类名和窗体名匹配的窗体，并返回这个窗体的句柄。找不到就返回0。
     hwndParent：若不为0，则搜索句柄为hwndParent窗体的子窗体。
     hwndChildAfter：若不为0，则按照z-index的顺序从hwndChildAfter向后开始搜索子窗体，否则从第一个子窗体开始搜索。
     lpClassName：字符型，是窗体的类名，这个可以在Spy++里找到。
     lpWindowName：字符型，是窗口名，也就是标题栏上你能看见的那个标题。
     代码示例里我们用来层层寻找输入框和寻找确定按钮
win32gui.SendMessage(hWnd, Msg, wParam, lParam)
    hWnd：整型，接收消息的窗体句柄
    Msg：整型，要发送的消息，这些消息都是windows预先定义好的，可以参见系统定义消息（System-Defined Messages）
    wParam：整型，消息的wParam参数
    lParam：整型，消息的lParam参数
    代码示例里我们用来向输入框输入文件地址以及点击确定按钮
"""

driver = webdriver.Chrome()
driver.get('http://sahitest.com/demo/php/fileUpload.htm')
driver.maximize_window()
driver.implicitly_wait(10)
time.sleep(1)
# form = driver.find_element(By.NAME,'form1')

upload = driver.find_element(By.ID,'file')
time.sleep(1)
x = upload.location.get('x')#百度搜索框的x坐标
y = upload.location.get('y')#百度搜索框的y坐标
ActionChains(upload).move_by_offset(x+5, y+5).click().perform()
print(x,y)
# upload.click()
# driver.execute_script("$(arguments[0]).click()",upload)
time.sleep(5)



# win32gui
dialog = win32gui.FindWindow('#32770', u'打开')  # 查找对话框
ComboBoxEx32 = win32gui.FindWindowEx(dialog, 0, 'ComboBoxEx32', None) #
ComboBox = win32gui.FindWindowEx(ComboBoxEx32, 0, 'ComboBox', None)
Edit = win32gui.FindWindowEx(ComboBox, 0, 'Edit', None)  # 上面三句依次寻找对象，直到找到输入框Edit对象的句柄
button = win32gui.FindWindowEx(dialog, 0, 'Button', None)  # 确定按钮Button

win32gui.SendMessage(Edit, win32con.WM_SETTEXT, None, r'C:\Users\Administrator\Pictures\微信截图_20231008084920.png')  # 往输入框输入绝对地址
win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, button)  # 按button
# upload = driver.execute_script('var items = {}; for (index = 0; index < arguments[0].attributes.length; ++index) { items[arguments[0].attributes[index].name] = arguments[0].attributes[index].value }; return items;', upload)
print('获取元素属性',upload.__getattribute__)
print('获取元素属性',upload)
# time.sleep(5)
driver.quit()

def upload_ele(by,ele,upload_file):
    clickxy_ele(by, ele)
    # win32gui
    dialog = win32gui.FindWindow('#32770', u'打开')  # 查找对话框
    ComboBoxEx32 = win32gui.FindWindowEx(dialog, 0, 'ComboBoxEx32', None)  #
    ComboBox = win32gui.FindWindowEx(ComboBoxEx32, 0, 'ComboBox', None)
    Edit = win32gui.FindWindowEx(ComboBox, 0, 'Edit', None)  # 上面三句依次寻找对象，直到找到输入框Edit对象的句柄
    button = win32gui.FindWindowEx(dialog, 0, 'Button', None)  # 确定按钮Button
    win32gui.SendMessage(Edit, win32con.WM_SETTEXT, None, upload_file)  # 往输入框输入绝对地址
    win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, button)  # 按button

def clickxy_ele(by,ele):
    upload = driver.find_element(by, ele)
    time.sleep(1)
    x = upload.location.get('x')  # 百度搜索框的x坐标
    y = upload.location.get('y')  # 百度搜索框的y坐标
    ActionChains(driver).move_by_offset(x + 5, y + 5).click().perform()